package beans.financeiro.contas;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UICommand;
import javax.faces.model.SelectItem;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import pojo.cadastro.financeiro.FormaPagamento;
import pojo.operacional.VendaLancamento;

public class ReceberBean implements Serializable{

    @PersistenceContext
    private EntityManager mgr;
    private String mensagemErros;

    // pojo
    private long id;

    // Campos de Pesquisa
    private Date dataVencimentoIni;
    private Date dataVencimentoFim;
    private String mesSel;
    private String formaPagamentoSel;

    // listas
    private List<VendaLancamento> listaVendaLancamentos;

    // botoes de comandos
    private UICommand btnCancelar;

    public ReceberBean() {
        listaVendaLancamentos = Collections.EMPTY_LIST;
    }

    public String pesquisar() {
        carregar();
        return null;
    }

    public String retornar() {
        return "pesquisa";
    }

    public void carregar() {

        listaVendaLancamentos = Collections.EMPTY_LIST;
        
        Date dataMesIni = null;
        Date dataMesFim = null;

        Calendar cal = Calendar.getInstance();
        int diaFimMes = 1;
        if (mesSel.equals("0") || mesSel.equals("2") || mesSel.equals("4") || mesSel.equals("6") || mesSel.equals("7") || mesSel.equals("9") || mesSel.equals("11")) {
            diaFimMes = 31;
        } else if (mesSel.equals("3") || mesSel.equals("5") || mesSel.equals("8") || mesSel.equals("10")){
            diaFimMes = 30;
        } else {
            diaFimMes = 29;
        }
        
        String sql = "SELECT vl FROM VendaLancamento vl, Venda v WHERE v.id = vl.venda.id AND v.cancelado = 0 ";
        if (this.dataVencimentoIni != null)
            sql += "AND vl.dataVencimento >= :dataVencimentoIni ";
        if (this.dataVencimentoFim != null)
            sql += "AND vl.dataVencimento >= :dataVencimentoIni ";
        if (!this.formaPagamentoSel.equals(""))
            sql += "AND vl.formaPagamento.id = :formaPagamentoSel ";

        if (!mesSel.equals("")) {
            cal.set(Calendar.MONTH, Integer.parseInt(mesSel));
            cal.set(Calendar.DAY_OF_MONTH,1);
            dataMesIni = cal.getTime();
            cal.set(Calendar.DAY_OF_MONTH,diaFimMes);
            dataMesFim = cal.getTime();
            sql += "AND vl.dataVencimento BETWEEN :dataMesIni AND :dataMesFim ";
        }
        sql += "AND vl.recebido = 0 ";
        sql += "ORDER BY vl.dataVencimento";

        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Query q1 = mgr.createQuery(sql);

        if (this.dataVencimentoIni != null)
            q1.setParameter("dataVencimentoIni", dataVencimentoIni);
        if (this.dataVencimentoFim != null)
            q1.setParameter("dataVencimentoFim", dataVencimentoFim);
        if (!formaPagamentoSel.equals(""))
            q1.setParameter("formaPagamentoSel", Long.parseLong(formaPagamentoSel));

        if (!mesSel.equals("")) {
            q1.setParameter("dataMesIni", dataMesIni);
            q1.setParameter("dataMesFim", dataMesFim);
        }
        //q1.setParameter("recebido", Boolean.parseBoolean(recebido));
        
        listaVendaLancamentos = q1.getResultList();

        cal = Calendar.getInstance();
        for (int i = 0;i<listaVendaLancamentos.size();i++) {
            if (!listaVendaLancamentos.get(i).isRecebido()){
                listaVendaLancamentos.get(i).setDataPagamento(cal.getTime());
            }
        }
        
        mgr.close();

    }

    public String receber() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        mgr.getTransaction().begin();
        try {
            for (VendaLancamento vl:listaVendaLancamentos) {
                if (vl.isRecebido()) {
                    mgr.merge(vl);
                }
            }
            mgr.getTransaction().commit();
        } catch (Exception e) {
            mensagemErros = "<FONT COLOR=RED><UL>\n";
            mensagemErros = mensagemErros + "<LI>Erro inesperado ao baixar Receitas! Contate o administrador do sistema.</LI>\n";
            mensagemErros = mensagemErros + "</UL></FONT>\n";
            Logger.getAnonymousLogger().log(Level.SEVERE,"Falha ao baixar Receitas",e);
            if (mgr.getTransaction().isActive()) {
                mgr.getTransaction().rollback();
            }
            return null;
        } finally {
            mgr.close();
        }

        listaVendaLancamentos = Collections.EMPTY_LIST;
        return "pesquisa";
    }

    // Getters and Setters
    public List<SelectItem> getListaFormaPagamentos() {
       String sql = "SELECT fp FROM FormaPagamento fp WHERE fp.baixaAutomatica = 0 ORDER BY fp.descricao";
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Query q1 = mgr.createQuery(sql);
        
        List<SelectItem> items = new ArrayList<SelectItem>();

        for (FormaPagamento fp : (List<FormaPagamento>) q1.getResultList()) {
            items.add(new SelectItem(fp.getId(), fp.getDescricao()));
        }

        mgr.close();
        return items;
    }

    public UICommand getBtnCancelar() {
        return btnCancelar;
    }

    public void setBtnCancelar(UICommand btnCancelar) {
        this.btnCancelar = btnCancelar;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getMensagemErros() {
        return mensagemErros;
    }

    public void setMensagemErros(String mensagemErros) {
        this.mensagemErros = mensagemErros;
    }

    public Date getDataVencimentoFim() {
        return dataVencimentoFim;
    }

    public void setDataVencimentoFim(Date dataVencimentoFim) {
        this.dataVencimentoFim = dataVencimentoFim;
    }

    public Date getDataVencimentoIni() {
        return dataVencimentoIni;
    }

    public void setDataVencimentoIni(Date dataVencimentoIni) {
        this.dataVencimentoIni = dataVencimentoIni;
    }

    public List<VendaLancamento> getListaVendaLancamentos() {
        return listaVendaLancamentos;
    }

    public void setListaVendaLancamentos(List<VendaLancamento> listaVendaLancamentos) {
        this.listaVendaLancamentos = listaVendaLancamentos;
    }

    public String getMesSel() {
        return mesSel;
    }

    public void setMesSel(String mesSel) {
        this.mesSel = mesSel;
    }

    public String getFormaPagamentoSel() {
        return formaPagamentoSel;
    }

    public void setFormaPagamentoSel(String formaPagamentoSel) {
        this.formaPagamentoSel = formaPagamentoSel;
    }

}